/**
 * @file Interpolator.h
 * @brief 插值器类的声明
 * 
 * 提供了高精度的空间插值功能，特性包括：
 * 1. 支持反距离权重(IDW)插值
 * 2. 支持基于八象限的三线性插值
 * 3. 自适应选择最优插值方法
 * 4. SIMD优化的数值计算
 */
#pragma once
#include "Point3D.h"
#include "KDTree.h"
#include <vector>
#include <utility>

class Interpolator
{
public:
    /**
     * @brief 构造函数
     * @param tree KD树实例的引用
     * 
     * 初始化插值器，关联KD树用于最近邻搜索
     */
    Interpolator(const KDTree& tree) : kdtree(tree) {}

    /**
     * @brief 计算目标点的插值结果
     * @param target 目标点坐标
     * @param neighbors 最近邻点列表，包含距离和节点指针
     * @return 返回插值结果，first为杨氏模量，second为泊松比
     * 
     * 根据邻近点的分布特征自动选择插值方法：
     * 1. 当目标点周围八个象限都有数据点时，使用三线性插值
     * 2. 其他情况使用反距离权重插值
     */
    std::pair<double, double> calculate(
        const Point3D &target,
        const std::vector<std::pair<double, KDTree::KDNode *>> &neighbors);

private:
    const KDTree& kdtree;  ///< KD树引用，用于空间搜索

    /**
     * @brief 执行反距离权重插值计算
     * @param target 目标点坐标
     * @param neighbors 最近邻点列表
     * @return 返回插值结果，first为杨氏模量，second为泊松比
     * 
     * 使用改进的IDW算法：
     * 1. 距离为0时直接使用该点的值
     * 2. 使用距离平方的倒数作为权重
     * 3. SIMD优化的权重计算
     */
    std::pair<double, double> calculateIDW(
        const Point3D &target,
        const std::vector<std::pair<double, KDTree::KDNode *>> &neighbors);

    /**
     * @brief 检查数据点的空间分布
     * @param neighbors 最近邻点列表
     * @return 如果八个象限都有数据点则返回true
     * 
     * 分析数据点在目标点周围的分布情况：
     * 1. 计算所有点的几何中心
     * 2. 检查每个点相对于中心点的象限位置
     * 3. 验证是否所有象限都有覆盖
     */
    bool checkOctantCoverage(
        const std::vector<std::pair<double, KDTree::KDNode *>> &neighbors);
};